// 判断是否为正则
export const isRegExp = (str) => {
	// 1. 检查是否为字符串且长度至少为2
	if (typeof str !== 'string' || str.length < 2) return false;

	// 2. 检查是否以 '/' 开头，并找到最后一个 '/'
	const startSlash = str[0] === '/';
	const lastSlashIndex = str.lastIndexOf('/');
	const hasEndSlash = lastSlashIndex > 0; // 避免首字符是唯一的 '/'

	if (!startSlash || !hasEndSlash) return false;

	// 3. 分割模式（pattern）和修饰符（modifiers）
	const pattern = str.slice(1, lastSlashIndex);
	const modifiers = str.slice(lastSlashIndex + 1);

	// 4. 验证修饰符是否合法（仅允许 g、i、m、s、u、y）
	const validModifiers = /^[gimsuy]*$/.test(modifiers);
	if (!validModifiers) return false;

	// 5. 尝试构造正则表达式
	try {
		new RegExp(pattern, modifiers);
		return true;
	} catch (e) {
		return false;
	}
}

export const stringToRegExp = (str) => {
	if (isRegExp(str)) {
		const lastSlashIndex = str.lastIndexOf('/');
		const pattern = str.slice(1, lastSlashIndex);
		const modifiers = str.slice(lastSlashIndex + 1);
		return new RegExp(pattern, modifiers);
	} else {
		return ''
	}
}

// 时间格式化
export const formatDate = (dateTemplate = 'YYYY-MM-DD hh:mm:ss', date = new Date()) => {
	date = new Date(date)
	if (!(date instanceof Date)) {
		throw new Error('您传入的类型不是时间格式！')
		return false
	} else {
		if (dateTemplate === 'stamp') {
			return date.getTime()
		}
		const YYYY = date.getFullYear()
		const M = String(date.getMonth() + 1)
		const MM = M.padStart(2, '0')
		const D = String(date.getDate())
		const DD = D.padStart(2, '0')
		const h = String(date.getHours())
		const hh = h.padStart(2, '0')
		const m = String(date.getMinutes())
		const mm = m.padStart(2, '0')
		const s = String(date.getSeconds())
		const ss = s.padStart(2, '0')
		const str = dateTemplate.replace(
			/Y{4}/g, YYYY).replace(/MM/g, MM).replace(/DD/g, DD).replace(/hh/g, hh).replace(/mm/g,
			mm).replace(/ss/g, ss).replace(/M/g, M).replace(/D/g, D).replace(/h/g, h).replace(
			/m/g, m).replace(/s/g, s)
		return str
	}
}

export const cloneDeep = (val) => {
	return JSON.parse(JSON.stringify(val))
}

export const isEmpty = (val) => {
	return val === undefined || val === '' || val === null
}